package com.gustavo.sistema.dao.jdbc;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.gustavo.sistema.dao.ErroDeBancoDeDados;
import com.gustavo.sistema.dao.VendaDao;
import com.gustavo.sistema.model.Venda;

public class VendaDaoJdbc extends DaoJdbc implements VendaDao {

	private static final String INSERIR_VENDA = "insert into venda (id_cliente, id_produto, data_venda) values (?,?,?);";
	private static final String ATUALIZA_VENDA = "update venda set id_cliente=?, id_produto=?, data_venda=?, where id = ?";
	private static final String EXCLUI_VENDA = "delete from venda where id=?";
	private static final String LISTAR_VENDA = "select id,id_cliente, id_produto, data_venda from Venda ORDER BY data_venda";

	public VendaDaoJdbc() {
	}

	@Override
	public boolean inserirVenda(Venda venda) throws ErroDeBancoDeDados {

		try {
			// abre uma conexao com banco
			abrirConexao();

			// preenche a query para realizar o "insert"
			PreparedStatement preparedStatement = conexao.prepareStatement(INSERIR_VENDA);

			int i = 1;
			preparedStatement.setInt(i++, venda.getCliente().getId());
			preparedStatement.setInt(i++, venda.getProduto().getId());
			preparedStatement.setDate(i++, new Date(venda.getDataVenda().getTime()));

			// caso a operacao seja realizada, retorna true
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
			// caso contrario retorna false
			return false;

		} catch (ClassNotFoundException e) {
			// Caso ocorra erro ao abrir a conexao
			throw new ErroDeBancoDeDados(e);

		} catch (SQLException e) {
			// caso ocorra qualquer erro ao executar a operacao no banco de
			// dados
			throw new ErroDeBancoDeDados(e);

		} finally {
			// independente de sucesso/erro fecha a conexao com banco de dados
			fecharConexao();
		}
	}

	@Override
	public boolean atualizarVenda(Venda venda) throws ErroDeBancoDeDados {

		try {
			abrirConexao();

			PreparedStatement preparedStatement = conexao.prepareStatement(ATUALIZA_VENDA);

			int i = 1;
			preparedStatement.setInt(i++, venda.getCliente().getId());
			preparedStatement.setInt(i++, venda.getProduto().getId());
			preparedStatement.setDate(i++, new Date(venda.getDataVenda().getTime()));
			preparedStatement.setInt(i++, venda.getId());

			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
			return false;
		} catch (ClassNotFoundException e) {
			// Caso ocorra erri ao abrir a conexao
			throw new ErroDeBancoDeDados(e);

		} catch (SQLException e) {
			// caso ocorra qualquer erro ao executar a operacao no banco de
			// dados
			throw new ErroDeBancoDeDados(e);

		} finally {
			// independente de sucesso/erro fecha a conexao com banco de dados
			fecharConexao();
		}
	}

	@Override
	public boolean excluirVenda(Integer id) throws ErroDeBancoDeDados {

		try {
			abrirConexao();

			PreparedStatement preparedStatement = conexao.prepareStatement(EXCLUI_VENDA);

			int i = 1;
			preparedStatement.setInt(i++, id);

			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
			return false;
		} catch (ClassNotFoundException e) {
			// Caso ocorra erri ao abrir a conexao
			throw new ErroDeBancoDeDados(e);

		} catch (SQLException e) {
			// caso ocorra qualquer erro ao executar a operacao no banco de
			// dados
			throw new ErroDeBancoDeDados(e);

		} finally {
			// independente de sucesso/erro fecha a conexao com banco de dados
			fecharConexao();
		}
	}

	@Override
	public List<Venda> listarVendas() throws ErroDeBancoDeDados {

		try {
			abrirConexao();

			PreparedStatement preparedStatement = conexao.prepareStatement(LISTAR_VENDA);

			// Executa a consulta SQL neste objeto PreparedStatement e retorna o
			// objeto ResultSet gerado pela consulta.
			ResultSet rs = preparedStatement.executeQuery();

			List<Venda> vendas = new ArrayList<Venda>();

			while (rs.next()) {

				Venda venda = new Venda();
				venda.setId(rs.getInt("id"));
				venda.getCliente().setId(rs.getInt("id_cliente"));
				venda.getProduto().setId(rs.getInt("id_produto"));
				venda.setDataVenda(rs.getDate("data_venda"));

				vendas.add(venda);
			}
			return vendas;

		} catch (ClassNotFoundException e) {
			// Caso ocorra erro ao abrir a conexao
			throw new ErroDeBancoDeDados(e);

		} catch (SQLException e) {
			// caso ocorra qualquer erro ao executar a operacao no banco de
			// dados
			throw new ErroDeBancoDeDados(e);

		} finally {

			// independente de sucesso/erro fecha a conexao com banco de dados
			fecharConexao();
		}

	}
}
